﻿// 功能： 保证变量的原子操作，避免使用锁。
#include <iostream>       // 引入标准输入输出库，用于打印输出
#include <thread>         // 引入多线程库 std::thread，用于创建线程
#include <atomic>         // 引入原子类型库 std::atomic，用于无锁线程安全操作
// 定义一个全局原子整数 counter，并初始化为 0
// 原子变量能保证在多线程环境下进行自增等操作时不会发生数据竞争，无需使用互斥锁
std::atomic<int> counter(0);

// 工作线程函数：每次执行 10000 次自增操作
void add() {
    for (int i = 0; i < 10000; ++i) {
        ++counter;  // 使用原子操作对 counter 进行递增，是线程安全的
    }
}
int main() {
    // 创建两个线程，同时执行 add 函数
    std::thread t1(add), t2(add);

    // 等待两个线程执行完成（主线程阻塞，直到 t1 和 t2 都结束）
    t1.join();
    t2.join();

    // 输出最终的计数结果
    // 由于使用了原子操作，理论上最终输出应该是 20000（两个线程各自执行了 10000 次 ++）
    std::cout << "counter = " << counter << std::endl;

    return 0;  // 程序正常结束
}

/*
 * | 技术点                | 说明                                   |
| ------------------ | ------------------------------------ |
| `std::atomic<int>` | 提供一种轻量级的线程安全方式，避免使用 `std::mutex` 的开销 |
| `++counter`        | 使用的是原子自增，底层会使用 CPU 的原子指令             |
| `std::thread`      | 启动两个并发线程执行同一个函数                      |
| `join()`           | 主线程等待子线程完成，防止主线程提前结束                 |

 * */